class Solution {
public:
    vector<vector<int>> getAncestors(int n, vector<vector<int>>& edges) {
        vector<set<int> > ret(n);
        vector<vector<int> > graph(n);
        vector<int> indeg(n);
        for(auto& vc : edges){
            graph[vc[0]].push_back(vc[1]);
            indeg[vc[1]]++;
        }
        
        queue<int> que;
        for(int i = 0;i < n;i++){
            if(indeg[i] == 0){
                que.push(i);
            }
        }
        
        while(!que.empty()){
            int u = que.front();
            que.pop();
            for(int& v : graph[u]){
                ret[v].insert(u);
                for(const int& k : ret[u]){
                    ret[v].insert(k);
                }
                --indeg[v];
                if(indeg[v] == 0){
                    que.push(v);
                }
            }
        }
        vector<vector<int> > ans(n);
        for(int i = 0;i < n;i++){
            for(const int& j : ret[i]){
                ans[i].push_back(j);
            }
        }
        return ans;
    }
};
